package com.groupYLP.CouponNexus.merchant.admin.common.log;

import cn.hutool.core.util.StrUtil;
import com.groupYLP.CouponNexus.merchant.admin.common.enums.DiscountTargetEnum;
import com.groupYLP.CouponNexus.merchant.admin.common.enums.DiscountTypeEnum;
import com.mzt.logapi.service.IParseFunction;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 常用枚举解析功能类
 * 实现了IParseFunction接口，专注于解析特定格式的枚举值
 */
@Component
public class CommonEnumParseFunction implements IParseFunction {

    // 折扣目标枚举类的名称
    public static final String DISCOUNT_TARGET_ENUM_NAME = DiscountTargetEnum.class.getSimpleName();
    // 折扣类型枚举类的名称
    private static final String DISCOUNT_TYPE_ENUM_NAME = DiscountTypeEnum.class.getSimpleName();

    /**
     * 返回解析功能的名称
     *
     * @return 解析功能的名称
     */
    @Override
    public String functionName() {
        return "COMMON_ENUM_PARSE";
    }

    /**
     * 根据输入值解析对应的枚举含义
     *
     * @param value 输入的值，应为'枚举类_具体值'的形式
     * @return 解析后的枚举含义
     * @throws IllegalArgumentException 如果输入格式不正确或枚举类名未知
     */
    @Override
    public String apply(Object value) {
        try {
            // 将输入值按第一个下划线分割
            List<String> parts = StrUtil.split(value.toString(), "_");
            if (parts.size() != 2) {
                throw new IllegalArgumentException("格式错误，需要 '枚举类_具体值' 的形式。");
            }

            // 获取枚举类名和枚举值
            String enumClassName = parts.get(0);
            int enumValue = Integer.parseInt(parts.get(1));

            // 根据枚举类名和值查找对应的枚举含义
            return findEnumValueByName(enumClassName, enumValue);
        } catch (NumberFormatException e) {
            // 如果第二个下划线后面的值不是整数，抛出异常
            throw new IllegalArgumentException("第二个下划线后面的值需要是整数。", e);
        }
    }

    /**
     * 根据枚举类名和值查找对应的枚举含义
     *
     * @param enumClassName 枚举类名
     * @param enumValue 枚举值
     * @return 查找到的枚举含义
     * @throws IllegalArgumentException 如果枚举类名未知
     */
    private String findEnumValueByName(String enumClassName, int enumValue) {
        // 根据枚举类名判断是折扣目标枚举还是折扣类型枚举
        if (DISCOUNT_TARGET_ENUM_NAME.equals(enumClassName)) {
            return DiscountTargetEnum.findValueByType(enumValue);
        } else if (DISCOUNT_TYPE_ENUM_NAME.equals(enumClassName)) {
            return DiscountTypeEnum.findValueByType(enumValue);
        } else {
            throw new IllegalArgumentException("未知的枚举类名: " + enumClassName);
        }
    }

}

